// 头文件包含了函数声明，宏定义，结构体声明，变量声明。
// 比如stdio.h系统头文件包含了printf，scanf, fopen函数
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include <unistd.h>

// 第1优先级：各种括号，如()、[]等、成员运算符 . ；
// 第2优先级：所有单目运算符，如++(自加)、--(自减)、!(非)、~(位非)等；
// 第3优先级：乘法运算符*、除法运算符/、求余运算符%；
// 第4优先级：加法运算符+、减法运算符-；
// 第5优先级：移位运算符<<、>>；
// 第6优先级：大于运算符>、大于等于运算符>=、小于运算符<、小于等于运算符<=；
// 第7优先级：等于运算符==、不等于运算符!=；
// 第8优先级：按位与运算符&；
// 第9优先级：按位异或运算符^；
// 第10优先级：按位或运算符|；
// 第11优先级：逻辑与运算符&&；
// 第12优先级：逻辑或运算符||；
// 第13优先级：三目条件运算符 ?: ；
// 第14优先级：各种赋值运算符，如=、+=、-=、*=、/= 等；
// 第15优先级：逗号运算, 。

// !(非): !0=1,!(非零)=0.
// >(大于): 1>2得到0，2>1得到1。支持整形，浮点型。
// <(小于): 1<2得到1，2<1得到0。支持整形，浮点型。
// >=(大于等于): 1>=2得到0，1>=1得到1。支持整形，浮点型。
// <=(小于等于): 1<=1得到1，2<=1得到0。支持整形，浮点型。
// ==(等于): 1==1得到1，2==1得到0。支持整形，<---------------->浮点型有问题。
// !=(等于): 1!=1得到0，2==1得到1。支持整形，<---------------->浮点型有问题。
// &&(并且): 0&&n=0,非0&&非0=1
// ||(或者): 非0||n=1,0||0=0,非0||非0=1

// int main(void)也是可以的
int main(int argc, char **argv)
{
// 注释的第二种用法/**/
/*
这里#if是预编译处理，#if后面的条件成立，就编译#if的内容，如果不成立编译#else内容。
#if
成立，编译此内容
#elif
成立，编译此内容
#else
成立，编译此内容
#enif
*/
#if 0
    char valuea = 0x55, valueb = 0xf0;
    printf("[%s,%d]use char test\n", __FILE__, __LINE__);
#else
    unsigned char valuea = 0x55, valueb = 0xf0;
    printf("[%s,%d]use unsigned char test\n", __FILE__, __LINE__);
#endif
    printf("[%s,%d]origin valuea=0x%x, valueb=0x%x\n", __FILE__, __LINE__, valuea, valueb);

    printf("[%s,%d]test ! operation================>\n", __FILE__, __LINE__);
    valuea = 0xf0;
    valuea = !valuea;
    printf("[%s,%d]value=%d\n", __FILE__, __LINE__, valuea);
    valuea = !valuea;
    printf("[%s,%d]value=%d\n", __FILE__, __LINE__, valuea);

    printf("[%s,%d]test >= operation================>\n", __FILE__, __LINE__);
    valuea = 0x55, valueb = 0xf0;
    printf("[%s,%d]0x%x > 0x%x finish:%d\n", __FILE__, __LINE__, valuea, valueb, valuea > valueb);

    valuea = 0x55, valueb = 0xf0;
    printf("[%s,%d]0x%x>=0x%x finish:%d\n", __FILE__, __LINE__, valuea, valueb, valuea >= valueb);

    printf("[%s,%d]test <= operation================>\n", __FILE__, __LINE__);
    valuea = 0x55, valueb = 0xf0;
    printf("[%s,%d]0x%x<0x%x finish:%d\n", __FILE__, __LINE__, valuea, valueb, valuea < valueb);
    printf("[%s,%d]0x%x<0x%x  finish:%d\n", __FILE__, __LINE__, valuea, valueb, (char)valuea < (char)valueb);

    valuea = 0x55, valueb = 0xf0;
    printf("[%s,%d]0x%x<=0x%x finish:%d\n", __FILE__, __LINE__, valuea, valueb, valuea <= valueb);

    printf("[%s,%d]test == operation================>\n", __FILE__, __LINE__);
    valuea = 0x55, valueb = 0xf0;
    printf("[%s,%d]0x%x==0x%x finish:%d\n", __FILE__, __LINE__, valuea, valueb, valuea == valueb);

    valuea = 0x55, valueb = 0xf0;
    printf("[%s,%d]0x%x!=0x%x finish:%d\n", __FILE__, __LINE__, valuea, valueb, valuea != valueb);

    printf("[%s,%d]test && operation================>\n", __FILE__, __LINE__);
    valuea = 0x55, valueb = 0xf0;
    printf("[%s,%d] 0x%x && 0x%x finish:%d\n", __FILE__, __LINE__, valuea, valueb, valuea && valueb);
    valuea = 0x00, valueb = 0xf0;
    printf("[%s,%d] 0x%x && 0x%x finish:%d\n", __FILE__, __LINE__, valuea, valueb, valuea && valueb);

    printf("[%s,%d]test || operation================>\n", __FILE__, __LINE__);
    valuea = 0x55, valueb = 0xf0;
    printf("[%s,%d] 0x%x || 0x%x finish:%d\n", __FILE__, __LINE__, valuea, valueb, valuea || valueb);
    valuea = 0x00, valueb = 0xf0;
    printf("[%s,%d] 0x%x || 0x%x finish:%d\n", __FILE__, __LINE__, valuea, valueb, valuea || valueb);

    valuea = 0x55, valueb = 0xf0;
    printf("[%s,%d]!= finish:%d\n", __FILE__, __LINE__, valuea != valueb);

    float tmpf1 = 0.33333333f, tmpf2 = 1.0f / 3.000001;
    printf("[%s,%d]%f==%f finish:%d\n", __FILE__, __LINE__, tmpf1, tmpf2, tmpf1 == tmpf2);
    printf("[%s,%d]%f!=%f finish:%d\n", __FILE__, __LINE__, tmpf1, tmpf2, tmpf1 != tmpf2);
    // 因为返回类型是int，因此return 整数;
    return 1;
}
